﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GestionePolveri2.DAL;
using GestionePolveriLib.BL;
using GestionePolveriLib.BL.Reports;
using FrameworkLib.Facades;

namespace GestionePolveriLib.Facades.Reports
{
    public class Report522Facade : FacadeBase<GestionePolveriEntities>
    {
        Filter522 m_filter = null;

        public Report522Facade()
        {
        }

        public Report522Facade(Filter522 filter)
        {
            m_filter = filter;
        }

        public List<AbbinamentoImpianto> GetAbbinamentiImpianti()
        {
            List<AbbinamentoImpianto> retValue = null;

            var obj = (from x in GetContext().ImpiantiGruppi
                      select new AbbinamentoImpianto()
                      {
                          Gruppo = x.Gruppo,
                          Descrizione = x.Descrizione
                      }).Distinct();

            if (obj.Any())
            {
                retValue = obj.ToList();
            }

            return retValue;
        }

        //public List<Report522> GetReport522Data()
        //{
        //    List<Report522> retValue = null;

        //    //SELECT SUM(GP.Movimenti.Quantita), GP.ImpiantiGruppi.Descrizione
        //    //FROM   GP.Impianti 
        //    //INNER JOIN GP.ImpiantiGruppi ON GP.Impianti.IDImpianto = GP.ImpiantiGruppi.IDImpianto 
        //    //INNER JOIN GP.Movimenti ON GP.Impianti.IDImpianto = GP.Movimenti.IDImpianto
        //    //--WHERE (GP.ImpiantiGruppi.Gruppo = 1) or (GP.ImpiantiGruppi.Gruppo = 2)
        //    //group by GP.ImpiantiGruppi.Gruppo, GP.ImpiantiGruppi.Descrizione 

        //    if(m_filter.Gruppo == -1)
        //        retValue = GetAllData();
        //    else
        //        retValue = GetDataByGruppo();

        //    return retValue;
        //}

        public List<Report522_2> GetReport522Data()
        {
            List<Report522_2> retValue = null;

            if (m_filter.Applicazione != string.Empty)
            {
                retValue = GetAllDataByApplicazione();
            }
            else
            {
                if (m_filter.Impianti != null)
                {
                    retValue = GetAllDataByImpianto();
                }
            }

            return retValue;
        }

        public List<Report522_2> GetAllDataByApplicazione()
        {
            int[] m_impiantiSelezionati = m_filter.Impianti;

            List<Report522_2> retValue = null;

            GestionePolveriEntities context = this.GetContext();
            var obj = from x in context.vw_StatisticaConsumi
                      where ((x.DataMovimento >= m_filter.PeriodFrom) && (x.DataMovimento <= m_filter.PeriodTo))
                            && !x.IsDeleted
                            && x.CodCausale == "S"
                            && x.Applicazione == m_filter.Applicazione
                            && m_impiantiSelezionati.Contains((int)x.IDImpianto)
                      orderby x.IDImpianto
                      select new Report522_2
                      {
                          DataMovimento = x.DataMovimento,
                          Applicazione = x.Applicazione,
                          CodicePolvere = x.CodicePolvere,
                          Descrizione = x.Descrizione,
                          Fornitore = x.Fornitore,
                          Impianto = x.Impianto,
                          IDImpianto = x.IDImpianto,
                          Quantita = x.Quantita,
                          DatiAbbinati = (from cc1 in context.ComposizioneColori
                                          where cc1.AnagPolveri.CodicePolvere == x.CodicePolvere
                                          select new Dati_Associati
                                          {
                                              ColoriAbbinati = cc1.AnagColori.CodiceColore + ", ",
                                              Famiglia = cc1.AnagColori.AnagFamiglie.Descrizione + ", "
                                          })
                      };

            if (obj.Any())
            {
                //retValue = (List<Report522_2>)obj.Where(x => x.Applicazione == m_filter.Applicazione).ToList();

                retValue = obj.ToList();
            }

            return retValue;
        }

        public List<Report522_2> GetAllDataByImpianto()
        {
            int[] m_impiantiSelezionati = m_filter.Impianti;

            List<Report522_2> retValue = null;

            GestionePolveriEntities context = this.GetContext();
            var obj = from x in context.vw_StatisticaConsumi
                      where ((x.DataMovimento >= m_filter.PeriodFrom) && (x.DataMovimento <= m_filter.PeriodTo))
                             && !x.IsDeleted
                             && x.CodCausale == "S"
                             && m_impiantiSelezionati.Contains((int)x.IDImpianto)
                      orderby x.IDImpianto
                      select new Report522_2
                      {
                          DataMovimento = x.DataMovimento,
                          Applicazione = x.Applicazione,
                          CodicePolvere = x.CodicePolvere,
                          Descrizione = x.Descrizione,
                          Fornitore = x.Fornitore,
                          Impianto = x.Impianto,
                          IDImpianto = x.IDImpianto,
                          Quantita = x.Quantita,
                          DatiAbbinati = (from cc1 in context.ComposizioneColori
                                          where cc1.AnagPolveri.CodicePolvere == x.CodicePolvere
                                          select new Dati_Associati
                                          {
                                              ColoriAbbinati = cc1.AnagColori.CodiceColore + ", ",
                                              Famiglia = cc1.AnagColori.AnagFamiglie.Descrizione + ", "
                                          })
                      };

            if (obj.Any())
            {
                retValue = obj.ToList();
            }

            return retValue;
        }

        private List<Report522> GetDataByGruppo()
        {
            List<Report522> retValue = null;

            GestionePolveriEntities context = this.GetContext();
            var obj = from i in context.Impianti
                      join ig in context.ImpiantiGruppi on i.IDImpianto equals ig.IDImpianto
                      join m in context.Movimenti on ig.IDImpianto equals m.IDImpianto
                      where ((m.DataMovimento >= m_filter.PeriodFrom) && (m.DataMovimento <= m_filter.PeriodTo))
                                                                      && ig.Gruppo == m_filter.Gruppo
                      //group new { i, ig, m } by ig.Gruppo into g
                      group m by new { ig.Gruppo, ig.Descrizione } into g
                      select new Report522
                      {
                          Quantita = g.Sum(p => p.Quantita),
                          Abbinamento = g.Key.Descrizione
                      };

            if (obj.Any())
            {
                retValue = obj.ToList();
            }

            return retValue;
        }
    }
}
